package ksx.struts.hello;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;

public final class HelloAction extends Action {

	/**
	 * Process the specified HTTP request, and create the corresponding HTTP
	 * response (or forward to another web component that will create it).
	 * Return an <code>ActionForward</code> instance describing where and how
	 * control should be forwarded, or <code>null</code> if the response has
	 * already been completed.
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		// These "messages" come from the ApplicationResources.properties file
		MessageResources messages = getResources(request);

		/*
		 * Validate the request parameters specified by the user Note: Basic
		 * field validation done in HelloForm.java Business logic validation
		 * done in HelloAction.java
		 */
		ActionMessages errors = new ActionMessages();
		String userName = (String) ((HelloForm) form).getUserName();

		String badUserName = "Monster";

		if (userName.equalsIgnoreCase(badUserName)) {
			errors.add("username", new ActionMessage(
					"hello.dont.talk.to.monster", badUserName));
			saveErrors(request, errors);
			return (new ActionForward(mapping.getInput()));
		}

		/*
		 * Having received and validated the data submitted from the View, we
		 * now update the model
		 */
		PersonBean pb = new PersonBean();
		pb.setUserName(userName);
		pb.saveToPersistentStore();

		/*
		 * If there was a choice of View components that depended on the model
		 * (or some other) status, we'd make the decision here as to which to
		 * display. In this case, there is only one View component.
		 * 
		 * We pass data to the View components by setting them as attributes in
		 * the page, request, session or servlet context. In this case, the most
		 * appropriate scoping is the "request" context since the data will not
		 * be neaded after the View is generated.
		 * 
		 * Constants.PERSON_KEY provides a key accessible by both the Controller
		 * component (i.e. this class) and the View component (i.e. the jsp file
		 * we forward to).
		 */

		request.setAttribute(Constants.PERSON_KEY, pb);

		// Remove the Form Bean - don't need to carry values forward
		request.removeAttribute(mapping.getAttribute());

		// Forward control to the specified success URI
		return (mapping.findForward("SayHello"));

	}
}